/*
  1.创建2个线程
  2.线程1调用 pthread_sigmask 屏蔽 SIGQUIT 信号,延时，等待线程2先执行完，使线程1最后执行 sigaction 
  3.线程2不屏蔽 SIGQUIT 信号
  4.线程1屏蔽了 SIGQUIT 信号，但是信号处理函数仍热执行了
  5.发现 sigaction 函数以最后调用的线程为准
*/

#include "spu.h"

void sig_handler1()
{
    printf("this is handler01\n");
}

void sig_handler2()
{
    printf("this is handler02\n");
}

void *thread_fun1(void *arg)
{
    sleep(1);  // 延时，等待线程2先执行完，使线程1最后执行 sigaction 
    printf("I am thread01\n");

    struct sigaction act;
    memset(&act, 0, sizeof(act));
    // 添加SIGQUIT信号到信号集
    sigaddset(&act.sa_mask, SIGQUIT);
    // 设置信号处理函数
    act.sa_handler = sig_handler1;
    // 设置线程信号处理
    sigaction(SIGQUIT, &act, NULL);

    // 屏蔽信号
    pthread_sigmask(SIG_BLOCK, &act.sa_mask, NULL);

    sleep(3);
    return (void*)1;
}


void *thread_fun2(void *arg)
{
    printf("I am thread02\n");

    struct sigaction act;
    memset(&act, 0, sizeof(act));
    // 添加SIGQUIT信号到信号集
    sigaddset(&act.sa_mask, SIGQUIT);
    // 设置信号处理函数
    act.sa_handler = sig_handler2;
    // 设置线程信号处理
    sigaction(SIGQUIT, &act, NULL);

    // 屏蔽信号
    //pthread_sigmask(SIG_BLOCK, &act.sa_mask, NULL);

    sleep(3);
    return (void*)2;
}


int main()
{
    int err1,err2;
    pthread_t tid1, tid2;
    void *__retval;

    err1 = pthread_create(&tid1, NULL, thread_fun1, NULL);
    if(err1 != 0)
    {
        printf("thread1 create failed\n");
        return 0;
    }

    err2 = pthread_create(&tid2, NULL, thread_fun2, NULL);
    if(err2 != 0)
    {
        printf("thread2 create failed\n");
        return 0;
    }

    sleep(2);
    // 向线程1发送SIGQUIT信号
    pthread_kill(tid1, SIGQUIT);
    // 向线程2发送SIGQUIT信号
    pthread_kill(tid2, SIGQUIT);

    // 链接线程1
    printf("pthread_join1 return %d\n",pthread_join(tid1, NULL));
    // 链接线程2
    printf("pthread_join2 return %d\n",pthread_join(tid2, NULL));


    pthread_exit(__retval);
}

